package cn.tm.ms.nerver.ft.route;


public interface IRoute<REQ, RES> {

	/**
	 * Mock放通服务
	 * 
	 * @param req
	 * @return
	 * @throws Throwable
	 */
	RES mock(REQ req) throws Throwable;
	
	/**
	 * 远程调度
	 * 
	 * @param req
	 * @return
	 * @throws Throwable
	 */
	RES route(REQ req) throws Throwable;
	
	/**
	 * 重试休眠周期计算方式
	 * <p>
	 * 为保证服务端能够有充足的时间释放句柄资源,首次或每次重试之前都休眠指定的时间后发起,
	 * 而且重试的频率因适当随时间戳和重试次数进行适当的延长,进入节省资源的消耗。
	 * 
	 * @param times 当前已重试次数
	 * @param maxRetryNum 最大重试次数,-1表示无限重试
	 * @param x 休眠基数(毫秒)
	 * @param timestamp 时间戳
	 * @return
	 */
	long fx(int times, int maxRetryNum,long x, long timestamp);
	
	void failNotify(REQ req);
	
}
